import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import csv
import pandas as pd

from util.util_image import draw_img
from util.util_csv import read_csv_to_numpy_array
from util.util_ris_pattern_2 import phase_2_pattern


def extract_and_save_rows(patterndb, output_filename='extracted_rows.csv', num_samples=91):
    """
    从给定的2D数组中提取第一行和最后一行，并从每行中均匀采样指定数量的点，
    然后将结果保存到CSV文件。

    参数:
    patterndb (numpy.ndarray): 输入的2D数组，形状应为 (360, 361) 或类似。
    output_filename (str): 输出CSV文件的名称。
    num_samples (int): 从每行中采样的点数。
    """
    # 检查输入数组维度
    if patterndb.ndim != 2:
        raise ValueError("输入的 patterndb 必须是一个二维数组。")

    total_cols = patterndb.shape[1]
    if num_samples > total_cols:
        raise ValueError(f"采样点数 ({num_samples}) 不能大于行的总长度 ({total_cols})。")

    # 1. 提取第一行和最后一行
    first_row = patterndb[0, :]
    last_row = patterndb[-1, :]

    # 2. 生成均匀采样的索引
    # np.linspace 会生成从0到总列数-1的均匀分布的点，共num_samples个
    # np.linspace 的 endpoint=False 确保索引不超出范围（如果需要包含最后一个元素，则可以设为True或省略）
    # np.round 然后将其四舍五入到最近的整数，得到整数索引
    indices = np.round(np.linspace(0, total_cols - 1, num_samples)).astype(int)

    # 3. 根据索引进行采样
    sampled_first_row = first_row[indices]
    sampled_last_row = last_row[indices]

    # 4. 将最后一行的采样结果倒序
    reversed_sampled_last_row = sampled_last_row[::-1]

    # 5. 准备写入CSV的数据
    # 将两个采样后的行合并成一个二维数组，方便保存
    # 例如，结果将是 [[...第一行采样数据...], [...最后一行采样数据...]]
    data_to_save = np.vstack([sampled_first_row, reversed_sampled_last_row])

    # 6. 保存到CSV文件
    # fmt='%g' 会根据数值大小自动选择最紧凑的表示法（整数或浮点）
    np.savetxt(output_filename, data_to_save, delimiter=',', fmt='%g')
    print(f"数据已保存至 '{output_filename}'。")
    print(f"第一行采样的索引: {indices}")
    # 可选：也保存索引
    # np.savetxt('sample_indices.csv', indices, delimiter=',', fmt='%d')



def plot_pattern3d_python(path_csv_phaseBit):
    # 读取码阵
    phaseBit = read_csv_to_numpy_array(path_csv_phaseBit)
    # 计算方向图
    pattern = phase_2_pattern(phaseBit)
    patterndb = pattern / np.max(pattern)
    patterndb = 20 * np.log10(patterndb)
    # 画2d验证
    # draw_img(patterndb)
    # 记录
    # extract_and_save_rows(patterndb, "../files/tools/plot/32x32-beam2(20,45)(20,225)-patterndb-python.csv", 91)




def filter_integer_rows(input_path, output_path):
    """
    读取CSV文件，筛选第一列是整数的行，并保存到新文件。

    参数:
        input_path (str): 输入CSV文件的路径。
        output_path (str): 输出CSV文件的路径。
    """
    try:
        with open(input_path, 'r', newline='', encoding='utf-8') as infile:
            reader = csv.reader(infile, delimiter='\t') # 假设原始文件是制表符分隔
            filtered_rows = []

            for row in reader:
                if not row: # 跳过空行
                    continue
                try:
                    row = row[0].split(',')
                    # 尝试将第一列的值转换为浮点数
                    first_col_value = float(row[0])
                    # 检查转换后的浮点数是否等于其整数部分
                    # 这可以判断原字符串是否代表一个整数值（如 "65" 或 "-65.0"）
                    if first_col_value == int(first_col_value):
                        filtered_rows.append(row)
                        # filtered_rows.append(str(row[0]) + "," + str(first_col_value + 28.8064))
                except (ValueError, IndexError):
                    # 如果第一列不是有效数字或行为空，则跳过该行
                    pass

        # 将筛选后的行写入新的CSV文件
        with open(output_path, 'w', newline='', encoding='utf-8') as outfile:
            writer = csv.writer(outfile, delimiter=',') # 输出文件使用逗号分隔
            writer.writerows(filtered_rows)

        print(f"筛选完成。包含第一列为整数的行已保存至 '{output_path}'。")

    except FileNotFoundError:
        print(f"错误：找不到文件 '{input_path}'。请检查路径是否正确。")
    except Exception as e:
        print(f"处理文件时发生错误: {e}")



def plot_linechart_compare(path_csv_compare):
    # 使用pandas读取CSV文件，默认会将第一行作为列名
    df = pd.read_csv(path_csv_compare, delimiter=',')
    print("CSV文件读取成功:")
    print(df.head()) # 打印前几行以确认数据
    # --- 2. 绘制折线图 ---
    # 设置图表大小
    plt.figure(figsize=(10, 6))
    # 绘制三条折线
    # x轴是 'Theta' 列，y轴分别是 'python', 'HFSS', 'real' 列
    # plt.plot(df['Theta'], df['python'], marker='o', linestyle='-', label='Python')
    # plt.plot(df['Theta'], df['HFSS'], marker='s', linestyle='--', label='HFSS')
    # plt.plot(df['Theta'], df['real'], marker='^', linestyle='-.', label='Real')
    plt.plot(df['Theta'], df['python'], linestyle='-', color='black', label='Python')
    plt.plot(df['Theta'], df['HFSS'], linestyle='-', color='blue', label='HFSS')
    plt.plot(df['Theta'], df['real'], linestyle='-', color='red', label='Real')
    # 添加图表标题和轴标签
    # plt.title('Comparison of Values across Theta')
    plt.xlabel('Theta')
    plt.ylabel('Normalized pattern')
    # 显示图例
    plt.legend()
    # 添加网格线以便阅读
    plt.grid(True, linestyle=':', alpha=0.7)
    # 自动调整布局以防止标签被遮挡
    plt.tight_layout()
    # 显示图表
    plt.show()



if __name__ == "__main__":
    # plot_pattern3d_python(
    #     "../files/dissertation/chapter_2-sim-AGA/32x32-d9.3mm-FD0.905/theta(0,60)-phi(0,0)-20250816/phaseBit_AGA_(0,0).csv")
    plot_pattern3d_python(
        "../files/dissertation/chapter_2-sim-AGA/32x32-d9.3mm-FD0.905/beam2-(20,45)-(20,225)/phaseBit_AGA_(((20,45),(20,225))).csv")
    # filter_integer_rows("../files/tools/plot/1-EL.csv", "../files/tools/plot/1-EL-format.csv")
    # filter_integer_rows("../files/tools/plot/1-AZ.csv", "../files/tools/plot/1-AZ-format.csv")
    # plot_linechart_compare("../files/tools/plot/32x32-beam1(0,0)-compare-az_67.csv")



